package clases;

import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

/**
 * @author Luis Hernandez.
 */
public class Usuario extends Root {

    private static String jefeOt = "Jefe Oficina tecnologica";
    private static String analista = "Analista de Unidad";
    private static String director = "Director CPYD";
    /**
     * Username del usuario.
     */
    private String usuario;
    /**
     * Clave del usuario.
     */
    private String password;
    /**
     * Nombre efectivo del usuario.
     */
    private String nombre;
    /**
     * E-mail del usuario.
     */
    private String correo;
    /**
     * Unidad a la que pertenece este usuario.
     */
    private String categoria;
    /**
     * Contacto es el telefono de un usuario del sistema
     *
     */
    private String contacto;
    /**
     * Permiso que tiene el usuario
     */
    private String permiso;

    public String getContacto() {
        return contacto;
    }

    public void setContacto(String contacto) {
        this.contacto = contacto;
    }

    /**
     * Constructor de la clase. 
     * 
     * Crea un nuevo Usuario con todos los atributos 
     * fijados en su respectivo valor nulo por defecto.
     */
    public Usuario() {
    }

    /**
     * Constructor de la clase. 
     * 
     * Crea un nuevo Usuario
     * con el username y el password especificados.
     * 
     * @param usuario Username del Usuario.
     * @param password Contrasena del Usuario.
     */
    public Usuario(String usuario, String password) {
        this.usuario = usuario;
        this.password = password;
    }

    /**
     * Constructor de la clase.
     * 
     * Crea un nuevo objeto Usuario con sus atributos
     * fijados en los valores proporcionados en la entrada.
     * @param usuario Username del Usuario.
     * @param password Contrasenia del Usuario.
     * @param nombre Nombre del Usuario.
     * @param correo Correo electronico del Usuario.
     * @param categoria Categoria del Usuario.
     */
    public Usuario(String usuario, String password, String nombre,
            String correo, String categoria, String contacto, String permiso) {
        this.usuario = usuario;
        this.password = password;
        this.nombre = nombre;
        this.correo = correo;
        this.categoria = categoria;
        this.contacto = contacto;
        this.permiso = permiso;
    }

    /**
     * Retorna el username.
     * @return string con el username del Usuario.
     */
    public String getUsuario() {
        return this.usuario;
    }

    /**
     * Fija el username en el valor dado.
     * @param usuario string con el nuevo valor del username.
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * Obtiene la contrasenia del Usuario.
     * @return string con la contrasenia del Usuario.
     */
    public String getPassword() {
        return this.password;
    }

    /**
     * Fija la contrasenia en el valor dado.
     * @param password string con el nuevo valor de la contrasenia.
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Obtiene el nombre del usuario.
     * @return string con el nombre del usuario.
     */
    public String getNombre() {
        return this.nombre;
    }

    /**
     * Fija el nombre del usuario en el valor dado.
     * @param nombre string con el nuevo nombre del usuario.
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Obtiene el e-mail del usuario.
     * @return string con el correo electronico del usuario.
     */
    public String getCorreo() {
        return this.correo;
    }

    /**
     * Fija el correo electronico del usuario en el valor dado.
     * @param correo string con el nuevo e-mail del usuario.
     */
    public void setCorreo(String correo) {
        this.correo = correo;
    }

    /**
     * Obtiene la categoria del usuario.
     * @return string con la categoria del usuario.
     */
    public String getCategoria() {
        return this.categoria;
    }

    /**
     * Fija la categoria del usuario en el valor dado.
     * @param categoria string con la nueva categoria del usuario.
     */
    public void setCategoria(String categoria) {
        this.categoria = categoria;
    }

    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if (this.usuario == null || this.usuario.length() < 1) {
            errors.add("usuario", new ActionMessage("errors.usuario.requerido"));
        }
        if (password == null || password.length() < 1) {
            errors.add("password", new ActionMessage("errors.password.requerido"));
        }
        return errors;
    }

    private Boolean esDirectorCPYD() {
        return this.categoria.equalsIgnoreCase("CPYD") && Usuario.validatePermiso(this.permiso);
    }

    private Boolean esAnalistaCPYD() {
        return this.categoria.equalsIgnoreCase("CPYD") && Usuario.validatePermiso(this.permiso);
    }

    private Boolean esJefeOT() {
        return this.categoria.equalsIgnoreCase("CPYD") && Usuario.validatePermiso(this.permiso);
    }

    public String getPermiso() {
        return permiso;
    }

    public void setPermiso(String permiso) {
        this.permiso = permiso;
    }

    private static boolean validatePermiso(String permiso) {
        if (!(permiso.equals(Usuario.analista)
                || permiso.equals(Usuario.director) || permiso.equals(Usuario.jefeOt))) {
            return false;
        } else {
            return true;
        }
    }

    public static ArrayList<String> getPermisos() {
        ArrayList<String> permisos = new ArrayList<String>(3);
        permisos.add(jefeOt);
        permisos.add(analista);
        permisos.add(director);
        return permisos;
    }
}
